# include <bits/stdc++.h>
# define N 1000005
using namespace std;
int n;
int sa[N],rk[N],r[N<<1];
int R[N],maxpos[N];
int rr[N<<1];
void add1(int a,int b)
{
    if(rk[a]>rk[b])
        swap(a,b);
    R[rk[a]]=max(R[rk[a]],rk[b]);
}
void add2(int a,int b)
{
    if(rk[a]>rk[b])
        swap(a,b);
    maxpos[rk[b]]=max(maxpos[rk[b]],rk[a]);
}
char ans[N];
char s[N<<1];
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>sa[i],sa[i]++,rk[sa[i]]=i;
    for(int i=1;i<=2*n-1;i++)
        cin>>r[i];
    rk[n+1]=0;
    for(int i=1;i<=n;i++)
        R[i]=i,maxpos[i]=0;
    int maxr=0;
    for(int i=1;i<=2*n-1;i++)
    {
        if(i%2)
        {
            int p=(i+1)/2,nowr=(r[i]+1)/2;
            if(nowr>min(p,n-p+1))
            {
                cout<<-1<<'\n';
                return ;
            }
            for(int j=maxr+1;j<=p+nowr-1;j++)   
                add1(j,2*p-j);
            if(p-nowr && p+nowr<=n)
                add2(p-nowr,p+nowr);
            maxr=max(maxr,p+nowr-1);
        }
        else
        {
            int p1=i/2,p2=i/2+1,nowr=r[i]/2;
            if(nowr>min(p1,n-p2+1))
            {
                cout<<-1<<endl;
                return ;
            }
            for(int j=maxr+1;j<=p2+nowr-1;j++)
                add1(j,p1+p2-j);
            if(p1-nowr && p2+nowr<=n)
                add2(p1-nowr,p2+nowr);
            maxr=max(maxr,p2+nowr-1);
        }
    }
    vector<pair<int,int>> v;
    int now=1;
    while(now<=n)
    {
        int lst=now;
        int nowr=now;
        while(now<=nowr)
        {
            nowr=max(nowr,R[now]);
            now++;
        }
        v.push_back({lst,nowr});
    }
    vector<pair<int,int>> v2;
    for(auto [l,r]:v)
    {
        int mxp=0;
        for(int i=l;i<=r;i++)
            mxp=max(mxp,maxpos[i]);
        for(int i=l;i<r;i++)
            if(rk[sa[i]+1]>=rk[sa[i+1]+1])
            {
                cout<<-1<<'\n';
                return ;
            }
        if(mxp>=l)
        {
            cout<<-1<<'\n';
            return ;
        }
        if(v2.size() && mxp<v2.back().first && rk[sa[l-1]+1]<rk[sa[l]+1])
        {
            int lstl=v2.back().first;
            v2.pop_back();
            v2.push_back({lstl,r});
        }
        else
            v2.push_back({l,r});
    }
    if(v2.size()>26)
    {
        cout<<-1<<'\n';
        return ;
    }
    char c='a'-1;
    for(auto [l,r]:v2)
    {
        c++;
        for(int i=l;i<=r;i++)
            ans[sa[i]]=c;
    }
    s[0]=s[2*n]='*';
    for(int i=1;i<2*n;i++)
        if(i&1)
            s[i]=ans[(i+1)/2];
        else
            s[i]='*';
    int maxp=0;
    maxr=0;
    for(int i=1;i<=2*n-1;i++)
    {
        if(i>maxr)
            rr[i]=1;
        else
            rr[i]=max(rr[maxp*2-i],maxr-i+1);
        if(i+rr[i]-1>maxr)
        {
            maxr=i+rr[i]-1;
            maxp=i;
        }
        while(i-rr[i]>=0 && i+rr[i]<=2*n && s[i-rr[i]]==s[i+rr[i]])
            rr[i]++;
    }
    for(int i=1;i<=2*n-1;i++)
        if(rr[i]-1!=r[i])
        {
            cout<<-1<<'\n';
            return ;
        }
    for(int i=1;i<=n;i++)
        cout<<ans[i];
    cout<<'\n';
}
int main()
{
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin>>T;
    while(T--)
        solve();
    return 0;
}